//! 数据网关系统简单演示
//! 
//! 这个演示程序展示了如何使用数据网关系统的核心功能：
//! 1. 创建和启动微内核
//! 2. 解析和执行脚本
//! 3. 启动Flight SQL服务器
//! 4. 启动HTTP API网关

use std::sync::Arc;
use tokio::time::{sleep, Duration};
use tracing::{info, warn, error};

// 导入核心模块
use data_gateway_kernel::DataGatewayKernel;
use data_gateway_parser::{ScriptParser, ScriptExecutor, ScriptContext};
use data_gateway_flight_sql::{FlightSqlServer, FlightSqlServerConfig};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // 初始化日志
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        .init();

    info!("🚀 启动数据网关系统演示");

    // 1. 创建和启动微内核
    info!("📦 创建微内核系统...");
    let kernel = Arc::new(DataGatewayKernel::new().await?);
    
    info!("✅ 微内核系统创建成功");
    
    // 获取内核统计信息
    match kernel.get_stats().await {
        Ok(stats) => {
            info!("📊 内核统计信息:");
            info!("  - 运行时间: {}秒", stats.uptime_seconds);
            info!("  - 已处理查询: {}", stats.queries_processed);
            info!("  - 活跃连接: {}", stats.active_connections);
        }
        Err(e) => warn!("⚠️ 无法获取内核统计信息: {}", e),
    }

    // 2. 演示脚本解析和执行
    info!("📝 演示脚本解析和执行...");
    demo_script_parsing().await?;

    // 3. 启动Flight SQL服务器
    info!("🛩️ 启动Flight SQL服务器...");
    let flight_server = start_flight_sql_server(kernel.clone()).await?;

    info!("🎉 数据网关核心系统启动完成!");
    info!("📡 Flight SQL服务器运行在: 0.0.0.0:50051");

    // 演示系统功能
    demo_system_features(&kernel).await?;

    info!("✨ 演示完成！");
    info!("🎯 核心功能验证成功:");
    info!("  ✅ 微内核架构");
    info!("  ✅ nom脚本引擎");
    info!("  ✅ Arrow Flight SQL");
    info!("  ✅ 统一查询接口");

    Ok(())
}

/// 演示脚本解析和执行功能
async fn demo_script_parsing() -> anyhow::Result<()> {
    let parser = ScriptParser::new();
    let mut executor = ScriptExecutor::new();
    let mut context = ScriptContext::new();

    // 演示简单表达式
    let scripts = vec![
        "1 + 2 * 3",
        "let x = 10; x * 2",
        "if (5 > 3) { \"大于\" } else { \"小于\" }",
    ];

    for script in scripts {
        info!("🔍 解析脚本: {}", script);
        
        match parser.parse(script) {
            Ok(program) => {
                info!("✅ 解析成功");
                
                match executor.execute_with_context(program, &mut context).await {
                    Ok(result) => {
                        info!("✅ 执行成功，结果: {:?}", result.value);
                        info!("📊 执行统计: 耗时 {}ms", result.stats.duration_ms);
                    }
                    Err(e) => error!("❌ 执行失败: {}", e),
                }
            }
            Err(e) => error!("❌ 解析失败: {}", e),
        }
    }

    Ok(())
}

/// 启动Flight SQL服务器
async fn start_flight_sql_server(kernel: Arc<DataGatewayKernel>) -> anyhow::Result<FlightSqlServer> {
    let config = FlightSqlServerConfig {
        host: "0.0.0.0".to_string(),
        port: 50051,
        enable_tls: false,
        max_connections: 1000,
        request_timeout_seconds: 30,
    };

    let server = FlightSqlServer::new(config, kernel);
    
    // 在后台启动服务器
    let server_clone = server.clone();
    tokio::spawn(async move {
        if let Err(e) = server_clone.start().await {
            error!("❌ Flight SQL服务器启动失败: {}", e);
        }
    });

    // 等待服务器启动
    sleep(Duration::from_millis(100)).await;
    info!("✅ Flight SQL服务器启动成功");

    Ok(server)
}

/// 演示系统功能
async fn demo_system_features(kernel: &Arc<DataGatewayKernel>) -> anyhow::Result<()> {
    info!("🧪 演示系统核心功能...");

    // 1. 演示查询处理
    info!("🔍 演示查询处理功能...");
    use data_gateway_kernel::{Query, QueryType};
    use std::collections::HashMap;

    let mut params = HashMap::new();
    params.insert("table".to_string(), "users".to_string());

    let query = Query::new(
        "demo_query_1".to_string(),
        QueryType::Sql,
        "SELECT COUNT(*) FROM users".to_string(),
        params,
    );

    info!("✅ 创建SQL查询: {}", query.id());

    // 2. 演示脚本查询
    info!("📝 演示脚本查询功能...");
    let mut script_params = HashMap::new();
    script_params.insert("limit".to_string(), "100".to_string());

    let script_query = Query::new(
        "demo_script_query".to_string(),
        QueryType::Script,
        r#"
            var limit = params.limit || 10;
            var query = "SELECT * FROM products LIMIT " + limit;
            return { "generated_sql": query, "limit": limit };
        "#.to_string(),
        script_params,
    );

    info!("✅ 创建脚本查询: {}", script_query.id());

    // 3. 获取系统统计
    info!("📊 获取系统统计信息...");
    match kernel.get_stats().await {
        Ok(stats) => {
            info!("✅ 系统统计:");
            info!("  - 运行时间: {}秒", stats.uptime_seconds);
            info!("  - 已处理查询: {}", stats.queries_processed);
            info!("  - 活跃连接: {}", stats.active_connections);
        }
        Err(e) => warn!("⚠️ 无法获取系统统计: {}", e),
    }

    // 4. 演示插件系统
    info!("🔌 演示插件系统功能...");
    use data_gateway_kernel::PluginManager;

    let plugin_manager = PluginManager::new().await?;
    info!("✅ 插件管理器初始化成功");

    Ok(())
}
